其他
【Java编程教程】详解Java 实例初始化
整理:Java面试那些事儿
Instance Initializer block用于初始化实例数据成员。它在每次创建类的对象时运行。
实例变量的初始化可以直接完成,但在实例初始化块中初始化实例变量时可以执行额外的操作。
Que)当我们可以直接在实例数据成员中赋值时,实例初始化块的用途是什么?例如:
class Bike{
int speed=100;
}
# 为什么要使用实例初始化块?
假设我必须在为实例数据成员赋值时执行一些操作,例如用于填充复杂数组的 for 循环或错误处理等。
实例初始化块的示例
class Bike7{
int speed;
Bike7(){System.out.println("速度是"+speed);}
{speed=100;}
public static void main(String args[]){
Bike7 b1=new Bike7();
Bike7 b2=new Bike7();
}
}
输出:
速度是100
速度是100
java中可以在三个地方进行操作:方法constructor堵塞
# 首先调用什么,实例初始化块或构造函数?
class Bike8{
int speed;
Bike8(){System.out.println("构造函数被调用");}
{System.out.println("实例初始化块被调用");}
public static void main(String args[]){
Bike8 b1=new Bike8();
Bike8 b2=new Bike8();
}
}
输出:
实例初始化块被调用
构造函数被调用
构造函数被调用
在上面的示例中,似乎首先调用了实例初始化程序块,但没有。实例初始化块在对象创建时被调用。Java 编译器在构造函数中的第一个语句 super() 之后复制实例初始化块。所以首先,构造函数被调用。关注公众号Java面试那些事儿,获取651页Java面试题,让我们通过下图来理解它:
注意:java 编译器在每个构造函数中复制实例初始化块的代码。
# 实例初始化块的规则:
# 在 super() 之后调用的实例初始化程序块的程序
class A{
A(){
System.out.println("调用父类构造函数");
}
}
class B2 extends A{
B2(){
super();
System.out.println("调用子类构造函数");
}
{System.out.println("实例初始化块被调用");}
public static void main(String args[]){
B2 b=new B2();
}
}
输出:
调用父类构造函数
实例初始化块被调用
调用子类构造函数
# 实例块的另一个例子
class A{ A(){
System.out.println("调用父类构造函数");
}
}
class B3 extends A{
B3(){
super();
System.out.println("调用子类构造函数");
}
B3(int a){
super();
System.out.println("调用子类构造器"+a);
}
{System.out.println("实例初始化块被调用");}
public static void main(String args[]){
B3 b1=new B3();
B3 b2=new B3(10);
}
}
输出:
父类构造函数被调用
实例初始化块被调用
子类构造函数被调用
父类构造函数被调用
实例初始化块被调用
调用子类构造函数 10
扫码进群记得备注:城市、昵称和技术方向。